
// 节流，如果在业务场景中传入多个类型不一样的参数，这边规定参数传入 ...args ，但是由于各个参数类型不一样，使用泛型的话会被第一个传递参数的类型限制，后面的参数延用这个参数类型，就无法使用，只能用any
export function throttle<T>(fn: (arg: T) => void, wait: number): (arg: T) => void {
  let canRun: boolean = true
  return (arg: T) => {
    if (!canRun) return
    canRun = false
    setTimeout(() => {
      fn(arg)
      canRun = true
    }, wait)
  }
}

type TData = {
  e: Event,
  arr: number[]
}
throttle((obj: TData) => {
  obj.e
  obj.arr
}, 1000)

throttle((e: Event) => { }, 1000)

// 防抖，传入多个参数时请以对象形式传入
export function debounce<T>(fn: (arg: T) => void, wait: number): (arg: T) => void {
  let timer: null | NodeJS.Timeout = null
  return (arg: T) => {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn(arg)
    }, wait)
  }
}

debounce((obj: { e: Event, num: number }) => { }, 1000)
